package com.ming.exception;

import com.ming.enums.ErrorCode;
import lombok.EqualsAndHashCode;

/**
 * 参数异常
 * 用于处理参数校验相关的异常情况
 *
 * @author ming
 * @version 1.0
 */
@EqualsAndHashCode(callSuper = true)
public class ParameterException extends BaseException {

    /**
     * 构造函数
     *
     * @param errorCode 错误码
     */
    public ParameterException(ErrorCode errorCode) {
        super(errorCode);
    }

    /**
     * 构造函数
     *
     * @param errorCode 错误码
     * @param message   自定义错误信息
     */
    public ParameterException(ErrorCode errorCode, String message) {
        super(errorCode, message);
    }

    /**
     * 构造函数
     *
     * @param errorCode 错误码
     * @param cause     原因
     */
    public ParameterException(ErrorCode errorCode, Throwable cause) {
        super(errorCode, cause);
    }

    /**
     * 构造函数
     *
     * @param errorCode 错误码
     * @param message   自定义错误信息
     * @param cause     原因
     */
    public ParameterException(ErrorCode errorCode, String message, Throwable cause) {
        super(errorCode, message, cause);
    }

    /**
     * 构造函数
     *
     * @param errorCode 错误码
     * @param message   自定义错误信息
     * @param data      错误数据
     */
    public ParameterException(ErrorCode errorCode, String message, Object data) {
        super(errorCode, message, data);
    }

    /**
     * 构造函数
     *
     * @param errorCode 错误码
     * @param message   自定义错误信息
     * @param data      错误数据
     * @param cause     原因
     */
    public ParameterException(ErrorCode errorCode, String message, Object data, Throwable cause) {
        super(errorCode, message, data, cause);
    }

    // ========== 常用静态工厂方法 ==========

    /**
     * 请求参数错误
     */
    public static ParameterException badRequest(String message) {
        return new ParameterException(ErrorCode.BAD_REQUEST, message);
    }

    /**
     * 请求参数错误（带数据）
     */
    public static ParameterException badRequest(String message, Object data) {
        return new ParameterException(ErrorCode.BAD_REQUEST, message, data);
    }

    /**
     * 参数缺失
     */
    public static ParameterException missing(String paramName) {
        return new ParameterException(ErrorCode.BAD_REQUEST, "请求参数缺失: " + paramName);
    }

    /**
     * 参数格式错误
     */
    public static ParameterException format(String paramName, String expectedFormat) {
        return new ParameterException(ErrorCode.BAD_REQUEST,
                String.format("参数 %s 格式错误，期望格式: %s", paramName, expectedFormat));
    }

    /**
     * 参数范围错误
     */
    public static ParameterException range(String paramName, Object min, Object max) {
        return new ParameterException(ErrorCode.BAD_REQUEST,
                String.format("参数 %s 超出范围，应在 %s 到 %s 之间", paramName, min, max));
    }

    /**
     * 参数长度错误
     */
    public static ParameterException length(String paramName, int minLength, int maxLength) {
        return new ParameterException(ErrorCode.BAD_REQUEST,
                String.format("参数 %s 长度错误，应在 %d 到 %d 之间", paramName, minLength, maxLength));
    }

    /**
     * 参数值无效
     */
    public static ParameterException invalid(String paramName, Object value) {
        return new ParameterException(ErrorCode.BAD_REQUEST,
                String.format("参数 %s 的值 %s 无效", paramName, value));
    }

    /**
     * 通用参数异常
     */
    public static ParameterException of(String message) {
        return new ParameterException(ErrorCode.BAD_REQUEST, message);
    }

    /**
     * 通用参数异常（带数据）
     */
    public static ParameterException of(String message, Object data) {
        return new ParameterException(ErrorCode.BAD_REQUEST, message, data);
    }
}